package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAlertaUsuario;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblFormaAlerta;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.LoginForm;
import com.mastercard.assets.web.struts.forms.RoleElegidoForm;
import com.mastercard.assets.web.util.to.UserLogin;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class RoleElegido
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		RoleElegidoForm f = ( RoleElegidoForm ) form ;
		
		try
		{
			int roleId = f.getRole( ), numAlert = 0 ;
			// realiza la actualizacion del rol
			user.setActualRoleId( roleId ) ;
                        
                        // verifica la cantidad de cuentas del usuario
			List< TblCuenta > cuentas = user.getUserCounts( ) ;
			
			// en caso de que sea rol 1 o 3
			if( roleId == 1 || roleId == 3 )
			{	
				// en cao de null
				if( cuentas == null )
					return mapping.findForward( "noCounts" ) ;
				
				// en caso de que tenga mas de una
				if( cuentas.size( ) > 1 )
				{
					if( user.getIdioma( ) == 0 ){
                                            return mapping.findForward( "CountsMoreThanOne" ) ;
                                        }else
                                            return mapping.findForward( "CountsMoreThanOneEng" ) ;
                                    
				}
				// en caso de que sea uno
				else if( cuentas.size( ) == 1 )
				{
					user.setActualCountId( cuentas.get( 0 ).getCveCuenta( ) ) ;
                                    try {
                                        numAlert = numAlertas( user.getCveUsuario( ), user.getActualCountId( ), user.getActualRoleId( ) ) ;
                                    } catch (Exception ex) {
                                        Logger.getLogger(RoleElegido.class.getName()).log(Level.SEVERE, null, ex);
                                    }
                                        user.setNumAler( numAlert );
                                        session.setAttribute( "UserLogin" , user ) ;
					return mapping.findForward( "success" ) ;
				}
				// en caso de uqe no haya
				else
				{
					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.login.NoCountExist" ) ) ;
					
					LoginForm f1 = new LoginForm( ) ;
					f1.setUser( user.getLogin( ) ) ;
					f1.setPass( user.getPaswd( ) ) ;
					
					request.setAttribute( "LoginForm" , f1 ) ;
					
					return mapping.findForward( "noCounts" ) ;
				}
			} else 
                            if(  roleId == 5 )
                            {
                                TblUsuario userData = MasterCardDAO.findUserById( user.getCveUsuario( ) ) ;
                                MasterCardDAO.closeEntityManager( ) ;
                                    List< TblTipoCuenta > TCUser = userData.getTblTipoCuentas( ) ;
                                    
                                    if( TCUser.isEmpty( ) || TCUser == null )
                                    {
                                        user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.login.NoCountExist" ) ) ;
					
					LoginForm f1 = new LoginForm( ) ;
					f1.setUser( user.getLogin( ) ) ;
					f1.setPass( user.getPaswd( ) ) ;
					
					request.setAttribute( "LoginForm" , f1 ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
					return mapping.findForward( "noCounts" ) ;
                                    }else{
                                        
                                        user.setCountType( TCUser.get( 0 ) ) ;
                                    }
                                    
                                    
//                                List< TblTipoCuenta > tblTC = new ArrayList< TblTipoCuenta >( ) ;
//				
//				// en caso de que tenga mas de una
//				if( cuentas.size( ) > 1 )
//				{
//                                    // LAS RECORRE PARA
//                                    for ( TblCuenta cuenta : cuentas )
//                                    {
//                                        // OBTIENE LA CLAVE DE TIPOCUENTA
//                                        TblTipoCuenta tipocuenta = cuenta.getTblTipoCuenta( ) ;
//                                        //SI EL ARREGLO DE TIPO CUENTA ESTA VACIO AGREGA LA CLAVE
//                                        if( tblTC.isEmpty() )
//                                        {
//                                            tblTC.add( tipocuenta ) ;
//                                        } else {
//                                            boolean yaEsta = false ;
//                                            // BUSCA SI YA TIENE EL TIPODECUENTA EN EL ARREGLO
//                                            for( TblTipoCuenta tc : tblTC )
//                                            {
//                                                if( tc.getCveTipoCuenta( ) ==  tipocuenta.getCveTipoCuenta( ) )
//                                                {
//                                                    yaEsta = true ;
//                                                    break ;
//                                                }
//                                            }
//                                            // SI NO ESTA LO AGREGA
//                                            if( yaEsta == false )
//                                                tblTC.add( tipocuenta ) ;
//                                            
//                                        }
//                                            
//                                        
//                                    }
//                                    //regresa los tipos de cuenta
//                                    request.setAttribute( "TypeOfCounts" , tblTC ) ;
//                                    return mapping.findForward( "TypeCountsMoreThanOne" ) ;
//				}
//                                // en caso de uqe no haya
//				else
//				{
//					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.login.NoCountExist" ) ) ;
//					
//					LoginForm f1 = new LoginForm( ) ;
//					f1.setUser( user.getLogin( ) ) ;
//					f1.setPass( user.getPaswd( ) ) ;
//					
//					request.setAttribute( "LoginForm" , f1 ) ;
//					
//					return mapping.findForward( "noCounts" ) ;
//				}
                                
                            }
			// en cao de que no sea banco o bdm o bdmTitular
                            else{
                                
                                try {
                                        numAlert = numAlertas( user.getCveUsuario( ), user.getActualCountId( ), user.getActualRoleId( ) ) ;
                                    } catch (Exception ex) {
                                        Logger.getLogger(RoleElegido.class.getName()).log(Level.SEVERE, null, ex);
                                    }
                                        user.setNumAler( numAlert );
                                        session.setAttribute( "UserLogin" , user ) ;
                                return mapping.findForward( "success" ) ;
                            }
				
		}catch( MasterCardException mce )
		{
			// en caso de error, revisa el error
			switch( mce.getErrorCode( ) )
			{
				case MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_USER_MUST_BE_LOGGEDIN : 
				case MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_USER_THERE_IS_NO_EXIST_THAT_ROLE :
					return mapping.findForward( "noLogin" ) ;
			}
		}
		
	  	return mapping.findForward( "success" ) ;
	}
        
        public static int numAlertas( int cveUsuario, int cuenta, int cveRol ) throws Exception{
    List< TblAlertaUsuario> resSinLeer = new ArrayList<TblAlertaUsuario>( ) ;        
            // ___________________________________________      Calcula alertas     ___________________________________________
try{
    
   List<TblAlertaUsuario> sinLeer = MasterCardDAO.getNoLeidas( cveUsuario ) ; // user.getAlertsNotReaded( ) ;
int cuentaAlerta = 0/*, cuenta = user.getActualCountId( )*/ ;
        

resSinLeer = new ArrayList< TblAlertaUsuario>();

// valida el rol
if (cveRol == 2) {
    // recorre alertas sin leer
    for (TblAlertaUsuario alert : sinLeer) {
        int clvRol = 0;

        // la alerta debe tener la clave del usuario
        if (alert.getTblUsuario().getCveUsuario() == cveUsuario) {
            
            if( alert.getTblNotificacion( ) == null ){
                List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                for( TblFormaAlerta FA : fa ){
                    
                    if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&( FA.getTblRole( ).getCveRole( ) == cveRol ) ){
                        resSinLeer.add(alert);
                    }
                }
            }else{
                
                int alNot = alert.getTblNotificacion().getTblRole().getCveRole();                        

                if (alNot == cveRol) {
                    clvRol = 1;
                }

                if (clvRol == 1) {
                    resSinLeer.add(alert);
                }
                            
            }
          }
       }

} else {
    
    // recorre alertas sin leer
    for (TblAlertaUsuario alert : sinLeer) {
        int clvRol = 0;
        // si tiene numero de cuenta
        if (alert.getTblCuenta() != null) {
            cuentaAlerta = alert.getTblCuenta().getCveCuenta();
                    
            // la alerta debe tener la clave del usuario
            if (alert.getTblUsuario().getCveUsuario() == cveUsuario && cuentaAlerta == cuenta) {
                
                if( alert.getTblNotificacion( ) == null ) {
                    
                    List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                    for( TblFormaAlerta FA : fa ) {
                        if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&( FA.getTblRole( ).getCveRole( ) == cveRol ) ) {
                            resSinLeer.add(alert);
                        }
                    }
                }else{
                    
                    int alNot = alert.getTblNotificacion().getTblRole().getCveRole();
                    
                    if (alNot == cveRol) {
                        clvRol = 1;
                    }

                    if (clvRol == 1) {
                        resSinLeer.add(alert);
                    }
                    
                            
                }
            }
        }// sin no tiene numero de ceunta
         else
            if ( alert.getTblNotificacion().getTblRole().getCveRole() == cveRol
                    && alert.getTblUsuario().getCveUsuario() == cveUsuario 
                    && alert.getLeida() == 1 && (alert.getTblNotificacion().getTipoNotificacion() > 6 ||
                    alert.getTblNotificacion().getTipoNotificacion() == 1 || alert.getTblNotificacion().getTipoNotificacion() == 2 ) )
                
                resSinLeer.add(alert);

            }

        }

//user.setNumAler( resSinLeer.size( ) ) ;
// ___________________________________________      Calcula alertas     ___________________________________________
    
}catch( Exception e ){
    e.printStackTrace( ) ;
}
return resSinLeer.size( ) ;
            
        }
}
